1.1.1Updated a month ago
import { FreshContext } from "$fresh/server.ts";
import { Package } from "$classes/package.ts";
import { ExtractFile } from "@components/package/files/Code.tsx";
import { PackageTab } from "$types/package_tabs.enum.ts";
import { User } from "$classes/user.ts";
import { Token } from "$classes/token.ts";

export async function handler(req: Request, ctx: FreshContext<Viapak.Package.State>) {
  const pathname = new URL(req.url).pathname;
  const namespace = ctx.params.namespace;
  const name = ctx.params.package;
  const version = ctx.params.version || 'latest';

  // Find package
  const _package = await Package.FindByPath(`@${namespace}/${name}@${version}`);

  if(!_package) return new Response(null, {
    headers: {
      Location: '/'
    },
    status: 307
  });

  // Set up tabs
  let tab = PackageTab.README;
  const query_tab = ctx.url.searchParams.get('tab')! as PackageTab;
  if(Object.values(PackageTab).includes(query_tab)) tab = query_tab;

  if(ExtractFile(pathname, _package)) tab = PackageTab.BROWSE;

  // UI Errors
  let error: string | undefined;
  if(!_package.versions.all.includes(_package.versions.current!)) {
    error = `${_package.namespace}/${_package.name} does not have a version "${_package.versions.current}"`;
    _package.versions.current = _package.versions.latest;
  }

  // Token+User references
  const tokens = await Token.find({
    uuid: { $in: _package.events.map(e => e.token) },
  });
  const users = await User.find({
    $relationship: {
      via: Token,
      match: { uuid: { $in: _package.events.map(e => e.token) } },
      select: 'user_id'
    }
  });

  // Context
  ctx.state.pathname = pathname;
  ctx.state.tab = tab;
  ctx.state.error = error;
  ctx.state._package = _package;
  ctx.state.users = users;
  ctx.state.tokens = tokens;
  ctx.state.token_users = Object.assign({}, ...tokens.map(({ uuid, user_id }) => ({[uuid]: users.find(u => u.id == user_id) || null})));

  return ctx.next();
}